package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import util.TimeZoneUtil;
import util.documentUtils;
import util.enviaEmail;
import bean.clienteBean;
import conexao.Conexao;
import dao.clienteDao;

public class cadastrarClienteServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public cadastrarClienteServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setCharacterEncoding("UTF-8");
		request.setCharacterEncoding("UTF-8");

		PrintWriter out = response.getWriter();
		
		Connection conn = null;
		try {
			conn = new Conexao().getConexao();
		} catch (SQLException e) {
			new enviaEmail().enviar(e);
			out.print("falhaConexao");
			return;
		}
		
		
		if (request.getParameter("cadastroNome") == "") {
			out.println("O nome não pode ser vazio.");
		}else if (request.getParameter("cadastroCPF") == "" && request.getParameter("cadastroCNPJ") == "") {
			out.println("Por favor informe um CPF ou CNPJ.");
		}else if(request.getParameter("cadastroCPF") != "" && request.getParameter("cadastroCNPJ") != ""){
			out.println("Não pode cadastrar ao mesmo tempo CPF e CNPJ.");
		}else {
			try {
				String nome = request.getParameter("cadastroNome");	
				String cpf = "";
				String cnpj = "";
				Integer numero = 0;
				
				if(request.getParameter("cadastroCPF") != "" && request.getParameter("cadastroCNPJ") == ""){
					if(new documentUtils().isCPF(request.getParameter("cadastroCPF"))){
						clienteBean cli = new clienteBean();
						cli.setCpf(request.getParameter("cadastroCPF"));
						cli.setIdEmpresa((Integer)request.getSession().getAttribute("idempresa"));
						if(new clienteDao().cpfCadastrado(conn, cli)){
							out.println("Este CPF já está cadastrado!");
							return;
						}else{
							cpf = request.getParameter("cadastroCPF");
						}
					}else{
						out.print("CPF inválido!");
						return;
					}
				}else{
					if(new documentUtils().isCNPJ(request.getParameter("cadastroCNPJ"))){
						clienteBean cli = new clienteBean();
						cli.setCpf(request.getParameter("cadastroCNPJ"));
						cli.setIdEmpresa((Integer)request.getSession().getAttribute("idempresa"));
						if(new clienteDao().cnpjCadastrado(conn, cli)){
							out.println("Este CNPJ já está cadastrado!");
							return;
						}else{
							cnpj = request.getParameter("cadastroCNPJ");
						}
					}else{
						out.print("CNPJ inválido!");
						return;
					}
				}
				String endereco = request.getParameter("cadastroEndereco");		
				if(request.getParameter("cadastroNumero") != ""){
					numero = Integer.parseInt(request.getParameter("cadastroNumero"));	
				}
				String bairro = request.getParameter("cadastroBairro");	
				Integer idCidade = Integer.parseInt(request.getParameter("selCidade"));	
				String telefone = request.getParameter("cadastroTelefone");	
				String celular = request.getParameter("cadastroCelular");	
				Integer idFuncionario = Integer.parseInt(request.getParameter("idFuncionario"));
				String situacao = "ativo";
				
				clienteBean cliente = new clienteBean();
				cliente.setNome(nome);
				cliente.setCpf(cpf);
				cliente.setCnpj(cnpj);
				cliente.setEndereco(endereco);
				cliente.setNumero(numero);
				cliente.setBairro(bairro);
				cliente.setIdCidade(idCidade);
				cliente.setTelefone(telefone);
				cliente.setCelular(celular);
				cliente.setIdFuncionario(idFuncionario);
				cliente.setSituacao(situacao);
				cliente.setIdEmpresa((Integer)request.getSession().getAttribute("idempresa"));
				
				cliente.setData(new TimeZoneUtil().getHoraLocal());

				new clienteDao().inserir(conn, cliente);
				conn.commit();

			} catch (Exception e) {
				try {
					conn.rollback();
				} catch (Exception ex) {
					new enviaEmail().enviar(ex);
					ex.printStackTrace();
				}
				new enviaEmail().enviar(e);
				throw new RuntimeException(e);
			} finally {
				try {
					conn.close();
				} catch (Exception ex) {
					new enviaEmail().enviar(ex);
				}
			}
		}
		
	}

}
